package com.cup.ali.sms.bean;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;

import lombok.Data;

/**
 * SMS阿里消息Bean
 * 示例：
 * 短信示例：【阿里云】 验证码${vcode}，您正进行支付宝的身份验证，打死不告诉别人！
 * 短信签名：阿里云
 * 短信模板: 验证码${vcode}，您正进行支付宝的身份验证，打死不告诉别人！
 */
@Data
public class SmsRequest {

	/**
	 * 必填:待发送手机号
	 */
	private String phoneNumbers;
    /**
     * 必填:短信签名-可在短信控制台中找到
     * 根据用户属性来创建符合自身属性的签名信息。企业用户需要上传相关企业资质证明，个人用户需要上传证明个人身份的证明。
     */
	private String signName;
	/**
	 * 必填:短信模板-可在短信控制台中找到
	 * 
	 * 短信模板可以支持验证码、短信通知、推广短信三种模式。验证码和短信通知，通过变量替换实现个性短信定制。推广短信不支持在模板中添加变量。
	 * 
	 * 短信模板状态包括：审核中、审核未通过、审核通过；
	 * 审核中：当前已提交了短信模板，正在排队等待审核。2个小时内会审核完毕。
	 * 审核通过：已通过了审核，短信签名和短信模板都通过审核时，就可以通过接口调取开始发送短信。
	 * 审核未通过：由于某些原因，签名审核未能通过。可以通过控制台“签名管理”来查看具体审核未通过的原因。
	 */
	private String templateCode;
    /**
     * 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
     */
	private Map<String,Object> templateParams;

    /**
     * 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
     */
	private String smsUpExtendCode;

    /**
     * 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
     */
	private String outId;
	
	/**
	 * 必填校验
	 * @return
	 */
	public String validate(){
		if(StringUtils.isBlank(this.phoneNumbers))return "待发送手机号[phoneNumbers] is empty";
		if(StringUtils.isBlank(this.signName))return "短信签名[signName] is empty";
		if(StringUtils.isBlank(this.templateCode))return "短信模板[templateCode] is empty";
		return null;
	}
	
	/**
	 * 根据阿里请求Bean要求定制Bean
	 * @return
	 * @throws Exception
	 */
	public SendSmsRequest buildRequest()throws Exception{
		String msg = this.validate();
    	if(!StringUtils.isBlank(msg))throw new IllegalAccessException(msg);
		//组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        //必填:待发送手机号
        request.setPhoneNumbers(this.phoneNumbers);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(this.signName);
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(this.templateCode);
        
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        if(this.templateParams!=null)request.setTemplateParam(JSON.toJSONString(this.templateParams));

        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        //request.setSmsUpExtendCode("90997");

        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        if(!StringUtils.isBlank(this.outId))request.setOutId(this.outId);
        return request;
	}
	
}
